local Lang = require("common.Lang")
local Util = require("common.Util")
local Msg = require("core.Msg")
local ObjHuman = require("core.ObjHuman")
local DailyTaskExcel = require("excel.dailyTask")
local BagLogic = require("bag.BagLogic")
local Grid = require("bag.Grid")
local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
local ItemDefine = require("bag.ItemDefine")
local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
local YunYingLogic = require("yunying.YunYingLogic")


DAILY_TASK_ID_1  = 1  --日常登陆1次 o
DAILY_TASK_ID_2  = 2  --赠送友情点5次 o
DAILY_TASK_ID_3  = 3  --进行3次招将 o
DAILY_TASK_ID_4  = 4  --擂台挑战3次 x
DAILY_TASK_ID_5  = 5  --通天塔扫荡/挑战3次 o
DAILY_TASK_ID_6  = 6  --公会boss挑战3次 o
DAILY_TASK_ID_7  = 7  --进行1次公会建设 o
DAILY_TASK_ID_8  = 8  --参与1次无尽试炼 x
DAILY_TASK_ID_9  = 9  --接取3次民生任务 o
DAILY_TASK_ID_10 = 10 --参与2次日常副本 o
DAILY_TASK_ID_11 = 11 --圣树试炼胜利3次 o
DAILY_TASK_ID_12 = 12 --征战扫荡5次 o

-- 查询每日任务
function dailyTaskQuery(human, isOnLogin)
	local sendErr = isOnLogin == false and true or false
	if RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_801, sendErr) ~= true then
		return
	end

	local dailyTaskConfig = DailyTaskExcel.dailyTask
	if not dailyTaskConfig then return end
	
	-- 每日更新
	ObjHuman.updateDaily(human)
	
	local msgRet = Msg.gc.GC_DAILYTASK_QUERY 
	local now = os.time()
	local ts1 = Util.getDayStartTime(now)
	msgRet.nextRefreshTime = 24 * 60 * 60 - (now - ts1)
	
	local cnt = 0
	for key, value in ipairs(DailyTaskExcel.dailyTask) do 
		cnt = cnt + 1
		msgRet.list[cnt].taskID = key
		msgRet.list[cnt].desc = value.taskDesc
		msgRet.list[cnt].maxCnt = value.taskCnt

		local len = 0 
		for i = 1, #value.reward do 
			len = len + 1
			local itemId = value.reward[i][1]
			local itemCnt = value.reward[i][2]
			Grid.makeItem(msgRet.list[cnt].itemData[len], itemId, itemCnt)
		end
		msgRet.list[cnt].itemData[0] = len


		msgRet.list[cnt].finishCnt = 0
		msgRet.list[cnt].isGet = 0
		msgRet.list[cnt].jump = value.panelID
		if human.db.dailyTask and human.db.dailyTask.task and human.db.dailyTask.task[key] then
			msgRet.list[cnt].finishCnt = human.db.dailyTask.task[key].finishCnt or 0
			if human.db.dailyTask.task[key].isGet then 
				msgRet.list[cnt].isGet = 1
			end
		end
	end
	
	local huoYueBoxConfig = DailyTaskExcel.huoYueBox
	msgRet.huoYueBox[0] = #huoYueBoxConfig
	for i=1,#DailyTaskExcel.huoYueBox do
		msgRet.huoYueBox[i].boxID = i 
		msgRet.huoYueBox[i].needHuoYue = huoYueBoxConfig[i].needHuoYue
		
		msgRet.huoYueBox[i].items[0] = #huoYueBoxConfig[i].reward
		for j=1,#huoYueBoxConfig[i].reward do
			local itemID = huoYueBoxConfig[i].reward[j][1]
			local itemCnt = huoYueBoxConfig[i].reward[j][2]
			Grid.makeItem(msgRet.huoYueBox[i].items[j],itemID,itemCnt)
		end

		local isGet = human.db.dailyTask and human.db.dailyTask.huoYueBox and human.db.dailyTask.huoYueBox[i] or 0
		msgRet.huoYueBox[i].isGet = isGet
	end

	msgRet.nowHuoYue = human.db.dailyTask and human.db.dailyTask.nowHuoYue or 0

	msgRet.list[0] = cnt
	--Msg.trace(msgRet)
	Msg.send(msgRet, human.fd)
end

-- 领取每日任务奖励
function dailyTaskGetReward(human, taskID)
	if RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_801) ~= true then
		return
	end

	local dailyTaskConfig = DailyTaskExcel.dailyTask[taskID]
	if not dailyTaskConfig then return end

	-- 每日更新
	ObjHuman.updateDaily(human)
	
	if human.db.dailyTask == nil or human.db.dailyTask.task == nil or human.db.dailyTask.task[taskID] == nil then
		return
	end

	-- 判断上限	
	if human.db.dailyTask.task[taskID].isGet then 
		return
	end
		
	if human.db.dailyTask.task[taskID].finishCnt == nil or human.db.dailyTask.task[taskID].finishCnt < dailyTaskConfig.taskCnt then
		return
	end
	
	-- 改db
	human.db.dailyTask.task[taskID].isGet = true


    -- 奖励倍数
	BagLogic.cleanMomentItemList()
	for i = 1, #dailyTaskConfig.reward do 
		local itemId = dailyTaskConfig.reward[i][1]
		local itemCnt = dailyTaskConfig.reward[i][2]
        if itemId == ItemDefine.ITME_HUOYUE_ID then
            onDailyTaskHuoYue(human,itemCnt)
        else
			local newCnt = math.ceil(itemCnt) 
			BagLogic.updateMomentItem(2, itemId, itemCnt)
        end
	end
    BagLogic.addMomentItemList(human, "daily_task")
--	ChatPaoMaLogic.trigger(human, ChatPaoMaLogic.TRIGGER_TYPE_2, rewardID, rewardCnt)
	-- 通知客户端
	dailyTaskQuery(human)
	
	RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_801)
end

-- 记录每个任务的完成次数
function recordDailyTaskFinishCnt(human, taskID, addCnt, noSend)
	-- 每日更新
	ObjHuman.updateDaily(human)

	human.db.dailyTask = human.db.dailyTask or {}
	human.db.dailyTask.task = human.db.dailyTask.task or {}
	human.db.dailyTask.task[taskID] = human.db.dailyTask.task[taskID] or {}
	
    if human.db.dailyTask.task[taskID].state ~= nil then
        return
    end

	human.db.dailyTask.task[taskID].finishCnt = (human.db.dailyTask.task[taskID].finishCnt or 0) + addCnt
	
	local dailyTaskConfig = DailyTaskExcel.dailyTask[taskID]
	if not dailyTaskConfig then return end
	if human.db.dailyTask.task[taskID].finishCnt >= dailyTaskConfig.taskCnt then
		human.db.dailyTask.task[taskID].finishCnt = dailyTaskConfig.taskCnt
		human.db.dailyTask.task[taskID].state = 1
		RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_801)

        ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_12,1)

        local msgRet = Msg.gc.GC_DAILYSHARE_SET
        msgRet.type = 1
        msgRet.desc = dailyTaskConfig.taskDesc
        Msg.send(msgRet,human.fd)

	end
	
	if noSend ~= true then
		dailyTaskQuery(human)
	end
end

-- 领取活跃宝箱
local function huoYueBoxCanGet(human,boxID)
	local dailyTaskDB = human.db.dailyTask
	if not dailyTaskDB then return end

	local isGet = dailyTaskDB.huoYueBox and dailyTaskDB.huoYueBox[boxID] or 0
	if isGet ~= 0 then return end

	local nowHuoYue = dailyTaskDB.nowHuoYue or 0
	local huoYueBoxConfig = DailyTaskExcel.huoYueBox[boxID]
	if nowHuoYue <= 0 or nowHuoYue < huoYueBoxConfig.needHuoYue then return end

	return true
end

function CG_DAILYTASK_GET_HUOYUEBOX(human,boxID)
	local huoYueBoxConfig = DailyTaskExcel.huoYueBox[boxID]
	if not huoYueBoxConfig then return end

	if not huoYueBoxCanGet(human,boxID) then return end

	human.db.dailyTask.huoYueBox = human.db.dailyTask.huoYueBox or {}
	human.db.dailyTask.huoYueBox[boxID] = 1
    
    local double = RoleSystemLogic.isDouble(human, RoleSystemDefine.ROLE_SYS_ID_801)
    local rewardCnt = double and 2 or 1
    local cjPrivilege = ChengjiuLogic.checkPrivilege(human,ChengjiuDefine.PRIVILEGE_TYPE_2)
    local item = Util.copyTable(huoYueBoxConfig.reward)
    if cjPrivilege then
        local random = math.random(1,100)
        if random <= 1 then
            local len = #item
            for i = 1,len do
                item[i][2] = item[i][2] * 2
            end
        end

       
    end

	if double then
		local len = #item
        for i = 1,len do
            item[i][2] = item[i][2] * rewardCnt
        end
	end
	
	local msgRet = Msg.gc.GC_DAILYTASK_GET_HUOYUEBOX
	msgRet.boxID = boxID
    msgRet.double = double and 1 or 0
	Msg.send(msgRet,human.fd)
    BagLogic.addItemList(human, item, "daily_task")
	RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_801)
end

function isDot(human)
	-- 主界面的任务包含2个标签 每日任务/成就
	if RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_801) ~= true then
		return false
	end
	
	if human.db.dailyTask and human.db.dailyTask.task then
		for k,v in pairs(human.db.dailyTask.task) do
			if k and v and v.isGet ~= true then
				local dailyTaskConfig = DailyTaskExcel.dailyTask[k]
				if dailyTaskConfig then
					local cnt = v.finishCnt or 0
					if cnt >= dailyTaskConfig.taskCnt then
						return true
					end
				end
			end		
		end	
	end

	for i=1,#DailyTaskExcel.huoYueBox do
		if huoYueBoxCanGet(human,i) then return true end
	end
	
	return false
end

function onDailyTaskHuoYue(human,sum)
	if not human.db.dailyTask then return end

	human.db.dailyTask.nowHuoYue = (human.db.dailyTask.nowHuoYue or 0) + sum

    YunYingLogic.onCallBack(human, "onDailyTask",sum)   
end

function onLogin(human)	
	recordDailyTaskFinishCnt(human, DAILY_TASK_ID_1, 1, true)
	dailyTaskQuery(human, true)	
end